/*
 * main.c
 *
 *  Created on: 19/09/2011
 *      Author: Ramiro - Matias
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "funciones.h"
#include "cscan.h"
#include "fscan.h"
#include "consola.h"
#include "socketUnix.h"
#include "threadsPPD.h"

int main ()
{
	int i, tamanio, resultadoPthread;
	char* map;
	char buff[512]="Estoy retocando el archivo";
    char* lectura = (char*) malloc(512);
    char* buffer = (char*) malloc (512);
    memcpy(buffer, buff, 512);
    posicionActual=0;
    //config CONFIG;
    //chs CHS;
    pthread_t threadConsola;

    //CONFIG = leerConfig(ARCHIVOCONFIG);
    config* CONFIG = (config*) malloc (sizeof(config));// = leerConfig (archivoConfig);

    config Config = leerConfig (ARCHIVOCONFIG);

    CONFIG = &Config;

	/******************Comunicacion con Consola********************
	 *****por ahora la inicia y se comunica, pero los mensajes*****
	 ****son strings, hay que cambiarlo para que envie paquetes****
	 **************************************************************
	 *******Tambien hay que empezar a implementar los threads******
	 *******************Mañana subo mas cosas**********************/


    resultadoPthread = pthread_create(&threadConsola, NULL, (void*)&tratarConsola, (void*)CONFIG);

    if (resultadoPthread==0){
    	printf("se creo bien el pthread");
    }else{
    	printf("No se creo un carajo");
    }

   	//para probar si funciona bien el cscan

    /*	colaDePedidos[0].numeroDeSector=5;
    	//colaDePedidos[0].infoAEscribir="!";
    	colaDePedidos[0].tipoDePedido=L;
    	colaDePedidos[1].numeroDeSector=7;
    	//colaDePedidos[1].infoAEscribir="A";
    	colaDePedidos[1].tipoDePedido=L;
    	colaDePedidos[2].numeroDeSector=1;
    	colaDePedidos[2].infoAEscribir="o";
    	colaDePedidos[2].tipoDePedido=E;
    	colaDePedidos[3].numeroDeSector=24;
    	colaDePedidos[3].infoAEscribir="a";
    	colaDePedidos[3].tipoDePedido=E;
    	colaDePedidos[4].numeroDeSector=29;
    	//colaDePedidos[4].infoAEscribir="s";
    	colaDePedidos[4].tipoDePedido=T;
    	colaDePedidos[5].numeroDeSector=30;
    	//colaDePedidos[5].infoAEscribir="t";
    	colaDePedidos[5].tipoDePedido=L;
    	colaDePedidos[6].numeroDeSector=28;
    	//colaDePedidos[6].infoAEscribir="e";
    	colaDePedidos[6].tipoDePedido=L;
    	colaDePedidos[7].numeroDeSector=15;
    	colaDePedidos[7].infoAEscribir="o";
    	colaDePedidos[7].tipoDePedido=E;
    	colaDePedidos[8].numeroDeSector=25;
    	//colaDePedidos[8].infoAEscribir=" ";
    	colaDePedidos[8].tipoDePedido=L;
    	colaDePedidos[9].numeroDeSector=5;
    	//colaDePedidos[9].infoAEscribir="h";
    	colaDePedidos[9].tipoDePedido=T;
    	colaDePedidos[10].numeroDeSector=2;
    	colaDePedidos[10].infoAEscribir="l";
    	colaDePedidos[10].tipoDePedido=E;
    	colaDePedidos[11].numeroDeSector=5;
    	colaDePedidos[11].infoAEscribir="y";
    	colaDePedidos[11].tipoDePedido=E;
    	colaDePedidos[12].numeroDeSector=31;
    	//colaDePedidos[12].infoAEscribir="o";
    	colaDePedidos[12].tipoDePedido=L;
    	colaDePedidos[13].numeroDeSector=5;
    	colaDePedidos[13].infoAEscribir="r";
    	colaDePedidos[13].tipoDePedido=E;
    	colaDePedidos[14].numeroDeSector=36;
    	//colaDePedidos[14].infoAEscribir="o";
    	colaDePedidos[14].tipoDePedido=L;
    	colaDePedidos[15].numeroDeSector=47;
    	//colaDePedidos[15].infoAEscribir="e";
    	colaDePedidos[15].tipoDePedido=L;
    	colaDePedidos[16].numeroDeSector=40;
    	//colaDePedidos[16].infoAEscribir="r";
    	colaDePedidos[16].tipoDePedido=L;
    	colaDePedidos[17].numeroDeSector=41;
    	//colaDePedidos[17].infoAEscribir="d";
    	colaDePedidos[17].tipoDePedido=T;
    	colaDePedidos[18].numeroDeSector=5;
    	//colaDePedidos[18].infoAEscribir="r";
    	colaDePedidos[18].tipoDePedido=L;
    	colaDePedidos[19].numeroDeSector=50;
    	//colaDePedidos[19].infoAEscribir="n";
    	colaDePedidos[19].tipoDePedido=L;
    	colaDePedidos[20].numeroDeSector=60;
    	//colaDePedidos[20].infoAEscribir=" ";
    	colaDePedidos[20].tipoDePedido=L;
    	colaDePedidos[21].numeroDeSector=55;
    	colaDePedidos[21].infoAEscribir="d";
    	colaDePedidos[21].tipoDePedido=E;
    	colaDePedidos[22].numeroDeSector=53;
    	colaDePedidos[22].infoAEscribir="a";
    	colaDePedidos[22].tipoDePedido=E;
    	colaDePedidos[23].numeroDeSector=57;
    	colaDePedidos[23].infoAEscribir="o";
    	colaDePedidos[23].tipoDePedido=E;
    	colaDePedidos[24].numeroDeSector=3;
    	//colaDePedidos[24].infoAEscribir="a";
    	colaDePedidos[24].tipoDePedido=L;
    	colaDePedidos[25].numeroDeSector=70;
    	//colaDePedidos[25].infoAEscribir=" ";
    	colaDePedidos[25].tipoDePedido=T;
    	colaDePedidos[26].numeroDeSector=73;
    	//colaDePedidos[26].infoAEscribir="p";
    	colaDePedidos[26].tipoDePedido=L;
    	colaDePedidos[27].numeroDeSector=75;
    	colaDePedidos[27].infoAEscribir="i";
    	colaDePedidos[27].tipoDePedido=E;
    	colaDePedidos[28].numeroDeSector=70;
    	colaDePedidos[28].infoAEscribir="e";
    	colaDePedidos[28].tipoDePedido=E;
    	colaDePedidos[29].numeroDeSector=72;
    	//colaDePedidos[29].infoAEscribir=" ";
    	colaDePedidos[29].tipoDePedido=T;

    	ordenarCola(colaDePedidos, 12, CHS);

       	for(i=0;i<30;i++)
    	{
    		printf("Sector[%i]---> %i\n", i, colaDePedidos[i].numeroDeSector);
    	}*/


    //para probar y ver los valores despues del leerConfig

    /*printf("El modo de inicio es: %s\n", CONFIG.inicio);
	printf("La IP del RAID es: %i\n", CONFIG.ip);
	printf("Al puerto que nos comunicamos con el RAID es el: %i\n", CONFIG.puerto);
	printf("Estamos utilizando el algoritmo: %s\n", CONFIG.algoritmo);
	printf("%s es el path para comunicarse cn la consola\n",CONFIG.pathSocketUnix);
	printf("El flag de log esta en: %i (1:activado.0:desactivado)\n", CONFIG.flaglog);
	printf("El identificador del disco es: %i\n", CONFIG.identificador);
	printf("Valor de CHS:%i.%i.%i\n", CONFIG.CHS.cilindros, CONFIG.CHS.cabezas, CONFIG.CHS.sectores);
	printf("Tiempo de lectura (en ms): %i\n", CONFIG.t_lectura);
	printf("Tiempo de escritura (en ms): %i\n", CONFIG.t_escritura);
	printf("Nuestro disco gira a %i revoluciones por minuto\n", CONFIG.RPM);
	printf("Tiempo de salto entre pistas: %ims\n", CONFIG.t_salto);*/


    /*tamanio = tamanioArchivo (FILEPATH);
    map = mapearArchivo (FILEPATH, tamanio);
    escribirSector(map,buffer,1);
    lectura = leerSector(map,1);


    //Para mostrar por pantalla lo que devuelve
    for (i = 0; i <=512; ++i) {
  	printf("%c", lectura[i]);
  	if (i%64==0 && i!=0){
       printf("\n");}
    }

    munmap (map, tamanio);*/

    /***PARA PROBAR LOS TRACE***/

    //traceFSCAN (895, 690, 965, bajando, Config);
    //traceCSCAN (0, 10, 11, Config);
    //traceCSCAN (992, 5, 11, Config); //Habria que testearlo mas pero con las pruebas que le hice va bastante bien

    pthread_join (threadConsola, NULL);

    return 0;
}

/*Para probar el ordenarColaSCAN() que lo vamos a usar para las colas del FSCAN*/
/*int main(){

	int i;

	cola_sectores colaDePedidos[50];
	chs CHS;
	CHS.cabezas=1;
	CHS.cilindros=10;
	CHS.sectores=100;
	char sentido = bajando;

	colaDePedidos[0].numeroDeSector=5;
		//colaDePedidos[0].infoAEscribir="!";
		colaDePedidos[0].tipoDePedido=L;
		colaDePedidos[1].numeroDeSector=7;
		//colaDePedidos[1].infoAEscribir="A";
		colaDePedidos[1].tipoDePedido=L;
		colaDePedidos[2].numeroDeSector=1;
		//colaDePedidos[2].infoAEscribir="o";
		colaDePedidos[2].tipoDePedido=E;
		colaDePedidos[3].numeroDeSector=24;
		//colaDePedidos[3].infoAEscribir="a";
		colaDePedidos[3].tipoDePedido=E;
		colaDePedidos[4].numeroDeSector=29;
		//colaDePedidos[4].infoAEscribir="s";
		colaDePedidos[4].tipoDePedido=L;
		colaDePedidos[5].numeroDeSector=30;
		//colaDePedidos[5].infoAEscribir="t";
		colaDePedidos[5].tipoDePedido=L;
		colaDePedidos[6].numeroDeSector=28;
		//colaDePedidos[6].infoAEscribir="e";
		colaDePedidos[6].tipoDePedido=L;
		colaDePedidos[7].numeroDeSector=15;
		//colaDePedidos[7].infoAEscribir="o";
		colaDePedidos[7].tipoDePedido=E;
		colaDePedidos[8].numeroDeSector=25;
		//colaDePedidos[8].infoAEscribir=" ";
		colaDePedidos[8].tipoDePedido=L;
		colaDePedidos[9].numeroDeSector=5;
		//colaDePedidos[9].infoAEscribir="h";
		colaDePedidos[9].tipoDePedido=L;
		colaDePedidos[10].numeroDeSector=2;
		//colaDePedidos[10].infoAEscribir="l";
		colaDePedidos[10].tipoDePedido=E;
		colaDePedidos[11].numeroDeSector=5;
		//colaDePedidos[11].infoAEscribir="y";
		colaDePedidos[11].tipoDePedido=E;
		colaDePedidos[12].numeroDeSector=31;
		//colaDePedidos[12].infoAEscribir="o";
		colaDePedidos[12].tipoDePedido=L;
		colaDePedidos[13].numeroDeSector=5;
		//colaDePedidos[13].infoAEscribir="r";
		colaDePedidos[13].tipoDePedido=T;
		colaDePedidos[14].numeroDeSector=36;
		//colaDePedidos[14].infoAEscribir="o";
		colaDePedidos[14].tipoDePedido=L;
		colaDePedidos[15].numeroDeSector=47;
		//colaDePedidos[15].infoAEscribir="e";
		colaDePedidos[15].tipoDePedido=L;
		colaDePedidos[16].numeroDeSector=40;
		//colaDePedidos[16].infoAEscribir="r";
		colaDePedidos[16].tipoDePedido=L;
		colaDePedidos[17].numeroDeSector=41;
		//colaDePedidos[17].infoAEscribir="d";
		colaDePedidos[17].tipoDePedido=E;
		colaDePedidos[18].numeroDeSector=5;
		//colaDePedidos[18].infoAEscribir="r";
		colaDePedidos[18].tipoDePedido=L;
		colaDePedidos[19].numeroDeSector=50;
		//colaDePedidos[19].infoAEscribir="n";
		colaDePedidos[19].tipoDePedido=L;
		colaDePedidos[20].numeroDeSector=60;
		//colaDePedidos[20].infoAEscribir=" ";
		colaDePedidos[20].tipoDePedido=L;
		colaDePedidos[21].numeroDeSector=55;
		//colaDePedidos[21].infoAEscribir="d";
		colaDePedidos[21].tipoDePedido=E;
		colaDePedidos[22].numeroDeSector=53;
		//colaDePedidos[22].infoAEscribir="a";
		colaDePedidos[22].tipoDePedido=E;
		colaDePedidos[23].numeroDeSector=57;
		//colaDePedidos[23].infoAEscribir="o";
		colaDePedidos[23].tipoDePedido=E;
		colaDePedidos[24].numeroDeSector=3;
		//colaDePedidos[24].infoAEscribir="a";
		colaDePedidos[24].tipoDePedido=L;
		colaDePedidos[25].numeroDeSector=70;
		//colaDePedidos[25].infoAEscribir=" ";
		colaDePedidos[25].tipoDePedido=L;
		colaDePedidos[26].numeroDeSector=73;
		//colaDePedidos[26].infoAEscribir="p";
		colaDePedidos[26].tipoDePedido=L;
		colaDePedidos[27].numeroDeSector=75;
		//colaDePedidos[27].infoAEscribir="i";
		colaDePedidos[27].tipoDePedido=E;
		colaDePedidos[28].numeroDeSector=70;
		//colaDePedidos[28].infoAEscribir="e";
		colaDePedidos[28].tipoDePedido=E;
		colaDePedidos[29].numeroDeSector=72;
		//colaDePedidos[29].infoAEscribir=" ";
		colaDePedidos[29].tipoDePedido=L;

		ordenarColaPedidosSCAN(colaDePedidos, sentido, 40);

		for(i=0;i<30;i++)
			{
				printf("Sector[%i]---> %i    TipoPedido[%i]\n", i, colaDePedidos[i].numeroDeSector, colaDePedidos[i].tipoDePedido);
			}

	return 0;
}*/
